///////////////////////////////////////////////////////////////////////////////
//	Copyright (c) 2009 Team Axiis
//
//	Permission is hereby granted, free of charge, to any person
//	obtaining a copy of this software and associated documentation
//	files (the "Software"), to deal in the Software without
//	restriction, including without limitation the rights to use,
//	copy, modify, merge, publish, distribute, sublicense, and/or sell
//	copies of the Software, and to permit persons to whom the
//	Software is furnished to do so, subject to the following
//	conditions:
//
//	The above copyright notice and this permission notice shall be
//	included in all copies or substantial portions of the Software.
//
//	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
//	EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
//	OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
//	NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
//	HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
//	WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
//	FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
//	OTHER DEALINGS IN THE SOFTWARE.
///////////////////////////////////////////////////////////////////////////////

package org.axiis.layouts.scale
{
	/**
	 * The base class for scales that deal with numerical data.
	 */
	public class ContinuousScale extends AbstractScale
	{
		/**
		 * @inheritDoc IScale#validate  
		 */
		override public function validate():void
		{
			super.validate();
			if(userMinValue == null)
				computedMinValue = computeMin();
			
			if(userMaxValue == null)
				computedMaxValue = computeMax();
		}
		
		/**
		 * Returns the minimum value from the dataProvider. 
		 */
		protected function computeMin():Object
		{
			var newMin:Object;
			for each(var o:Object in dataProvider)
			{
				var currValue:Object = dataField == null ? o : o[dataField];
				if(newMin == null)
					newMin = currValue;
				else
					newMin = currValue < newMin ? currValue : newMin;
			}
			return newMin;
		}
		
		/**
		 * Returns the maximum value from the dataProvider. 
		 */
		protected function computeMax():Object
		{
			var newMax:Object;
			for each(var o:Object in dataProvider)
			{
				var currValue:Object = dataField == null ? o : o[dataField];
				if(newMax == null)
					newMax = currValue;
				else
					newMax = currValue > newMax ? currValue : newMax;
			}
			return newMax;
		}
	}
}